import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.concurrent.*;

import java.util.ArrayList;

import co.edu.uniandes.ecos.dal.MensajeDal;
import co.edu.uniandes.ecos.entidades.Mensaje;

public class ServidorEventosEagleEye {

	public static void main(String[] args) {
		if (args.length < 1) {
			System.out.println("debe pasar el parametro:  puerto");
			System.exit(-1);
		}

		int puerto = Integer.parseInt(args[0]);
		ServerSocket serverSocket = null;
		try {
			serverSocket = new ServerSocket(puerto);

		} catch (IOException e) {
			System.err.println("No se puede escuchar en puerto: " + puerto
					+ ". " + e.getMessage());
			System.exit(-1);
		}

		new HiloDesencolador().start();

		while (true) {
			try {
				new HiloEvento(serverSocket.accept()).start();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

}

class HiloDesencolador extends Thread {
	public HiloDesencolador() {

	}

	public void run() {
		while (true) {
			try {
				Thread.sleep(2000);
				synchronized (this) {
					// System.out.println("Desencolandooo A ["+RegistradorEventoMsyql.bufferMensajes.size()+"]");
					if (RegistradorEventoMsyql.bufferMensajes.size() > 0) {
						// System.out.println("Desencolandoooooo");
						MensajeDal dal = new MensajeDal();
						while (RegistradorEventoMsyql.bufferMensajes.size() > 0) {

							try {
								Mensaje m = RegistradorEventoMsyql.bufferMensajes
										.remove(0);
								dal.guardarMensaje(m);
							} catch (SQLException e) {
								e.printStackTrace();
							}

						}

					}

				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}
}

class HiloEvento extends Thread {
	private Socket socketCliente;

	public HiloEvento(Socket cliente) {
		this.socketCliente = cliente;
	}

	public void run() {
		try {

			BufferedReader in = new BufferedReader(new InputStreamReader(
					socketCliente.getInputStream()));

			String mensaje = in.readLine();
			RegistradorEvento evento = new RegistradorEventoMsyql();
			evento.registrarEvento(mensaje);

			in.close();
			this.socketCliente.close();
		} catch (IOException e2) {
			e2.printStackTrace();
		}
	}

}

interface RegistradorEvento {
	public boolean registrarEvento(String mensaje);
}

class RegistradorEventoMsyql implements RegistradorEvento {

	public static ArrayList<Mensaje> bufferMensajes = new ArrayList<Mensaje>();

	@Override
	public boolean registrarEvento(String mensaje) {

		String codigoCasa = mensaje.substring(0, 4);
		String tipoEvento = mensaje.substring(4, 6);
		String numeroPersonas = mensaje.substring(6, 8);
		String infoAdicional = mensaje.substring(8, mensaje.length());

		Mensaje mensajeE = new Mensaje();
		mensajeE.setCantidadPersonasXVivienda(numeroPersonas);
		Timestamp sqlT = new Timestamp(Calendar.getInstance().getTimeInMillis());
		mensajeE.setFecha(sqlT);
		mensajeE.setIdCasa(codigoCasa);
		mensajeE.setIdEvento(tipoEvento);
		mensajeE.setInfoAdicional(infoAdicional);

		synchronized (this) {
			RegistradorEventoMsyql.bufferMensajes.add(mensajeE);
			// System.out.println("Agregoooo ["+RegistradorEventoMsyql.bufferMensajes.size()+"]");
		}

		/*
		 * try { MensajeDal dal = new MensajeDal();
		 * 
		 * //dal.guardarMensaje(mensajeE); } catch (SQLException e) {
		 * e.printStackTrace(); }
		 */

		// System.out.println("Registrando evento en repositorio");
		// System.out.println("=============");
		return true;
	}

}
